package br.usp.icmc.client.controladores;

import java.sql.SQLException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import br.usp.icmc.client.dao.ServiceDAO;
import br.usp.icmc.client.entidades.Client;
import br.usp.icmc.client.entidades.KeyWord;
import br.usp.icmc.client.entidades.Service;
import br.usp.icmc.client.exception.PublishException;



/********************************************************************************
 * <b> <br> Projeto: Aplicativo Cliente <br><b>
 * 
 * Classe de controle do Serviço
 * 
 * @author felipe
 * 
 *******************************************************************************/
public class ControllerService {
	
	ServiceDAO serviceDAO;
	Service service;

	
	/****************************************************************************
	 * Construtor padrão da entidade ControllerService
	 ***************************************************************************/
	public ControllerService() {
		serviceDAO = new ServiceDAO();
		service = new Service();
	}
	
	
	/****************************************************************************
	 * Remove um serviço do sistemas
	 * 
	 * @param idService
	 * 			ID do serviço a ser removido
	 * @return
	 * 			Retorna 'true' caso a operação seja realizada com sucesso
	 ***************************************************************************/
	public boolean removeService(long idService){
		serviceDAO.deleteById(idService);
		return true;
	}
	


	/**************************************************************************************
	 * Adiciona um serviço ao sistema
	 * 
	 * @param name
	 * 			Nome do serviço
	 * @param description
	 * 			Descrição do serviço
	 * @param url
	 * 			Endereço URL do serviço
	 * @param helpUrl
	 * 			Endereço da URL de ajuda do serviço
	 * @param endPoint
	 * 			Endpoint do serviço (WSDL)
	 * @param version
	 * 			Versão do serviço
	 * @param license
	 * 			Licença do serviço
	 * @param emailProvider
	 * 			Email do provedor do serviço
	 * @param serviceKey
	 * 			Chave do serviço
	 * @param bindingKey
	 * 			Binding key do serviço
	 * @param responseTime
	 * 			Tempo de resposta do serviço
	 * @param pending
	 * 			Pendência
	 * @return
	 * 		Retorna o serviço adicionado
	 * @throws PublishException
	 ***************************************************************************************/
	public Service addService(String name, String description, String url, String helpUrl,
							  			String endPoint, String version, String license, String emailProvider) throws PublishException{
		

		service.setDescription(description);
		service.setHelpUrl(helpUrl);
		service.setLicense(license);
		service.setName(name);
		service.setUrl(helpUrl);
		service.setVersion(version);
		service.setEndPoint(endPoint);
		service.setEmailProvider(emailProvider);
		
		serviceDAO.save(service);
		
		return service;
	}
	
	/***********************************************************************************
	 * Edita um serviço
	 * 
	 * @param name
	 * 			Nome do serviço
	 * @param description
	 * 			Descrição do serviço
	 * @param url
	 * 			Endereço URL do serviço
	 * @param helpUrl
	 * 			Endereço da URL de ajuda do serviçp
	 * @param endPoint
	 * 			Endpoint do serviço
	 * @param version
	 * 			Versão do serviço
	 * @param license
	 * 			Licença do serviço
	 * @param serviceKey
	 * 			Chave do serviço
	 * @param bindingKey
	 * 			Binding key do serviço
	 * @param responseTime
	 * 			Tempo de resposta
	 * @param pending
	 * 			Pendência
	 * @param idService
	 * 			ID do serviço
	 * @throws PublishException
	 **************************************************************************************/
	public void editService(String name, String description, String url, String helpUrl,
  					String endPoint, String version, String license, Long idService) throws PublishException{
		
		
		service = serviceDAO.load(idService);
		
		service.setDescription(description);
		service.setHelpUrl(helpUrl);
		service.setLicense(license);
		service.setName(name);
		service.setUrl(url);
		service.setVersion(version);
		service.setEndPoint(endPoint);
		
		serviceDAO.saveOrUpdate(service);


	}
	

	/**********************************************************************************
	 * Lista os serviços publicados por um provedor
	 * 
	 * @param email
	 * 		Email do provedor
	 * @return
	 * 		Retorna uma lista de serviços
	 **********************************************************************************/
	public List listServiceProvider(String email){
		return serviceDAO.selectServiceProvider(email);
		
	}
	
	/**
	 * Lista o serviço com determinado nome
	 * 
	 * @param name
	 * 		Nome do Serviço
	 * @return
	 * 		Serviço com o tal nome
	 */
	public List serviceByName(String name){
		return serviceDAO.serviceByName(name);
	}
	
	/**
	 * Lista as keywords de um serviço
	 * 
	 * @param idService
	 * 		ID do serviço
	 * @return
	 * 		Keyword associadas ao serviço
	 */
	public List serviceKw(Long idService){
		return serviceDAO.selectServicesKeyWord(idService);
	}


}



